#include "queryscore.h"
#include "ui_queryscore.h"

QueryScore::QueryScore(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::QueryScore)
{
    ui->setupUi(this);
    setWindowFlags(Qt::Widget);//使dialog项目有最大最小化按钮
    //设置模型
    model = new QSqlTableModel(this);
    model->setTable("chooseCourse");//指定使用哪个表
    //把model放在view
    this->ui->tableView->setModel(model);
    //QSqlTableModel默认是可读写的模型，该语句从视图进行设置，使其成为只读模型
    this->ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    //列宽随窗口大小改变而改变，每列平均分配，充满整个表，但是此时列宽不能拖动进行改变
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    //一次选中一行
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    this->ui->listWidget->addItem(QString("欢迎查询个人课程信息。\n\n请输入个人学号查询您的课程信息。\n\n右边栏里将显示您的各科成绩，\n并计算您获得的总学分和绩点。\n\n用成绩给各科排序可帮助您\n了解自己的弱势学科。"));
    setAttribute(Qt::WA_DeleteOnClose, true);//这句话，使该窗口close（）后自动销毁
}

QueryScore::~QueryScore()
{
    delete ui;
}

//60分以下绩点为0.第一次考不过，以后考多少分绩点都是1
//单科绩点=单科分数/10-5
//一门课程的学分绩点=该课程的学分数×绩点数
//一学期平均绩点=该学期学分绩点之和/该学期修学分之和
void QueryScore::countScore()
{
    float credit=0;//总学分
    float scoreInt=0;//总绩点
    for (int i=0; i<model->rowCount();i++)
    {
        QSqlRecord record = model->record(i);
        QString name=record.value("课程名称").toString();
        QString scoreString=record.value("考试成绩").toString();
        this->ui->listWidget->addItem(QString("%1:%2").arg(name).arg(scoreString));

        //考试成绩先用toString是因为：
        //如果用toInt，那么不管这一栏是写着0还是没填，toInt得到的都是0，而toString不会
        if(record.value("是否重修").toString()=="是")
        {
            if(record.value("考试成绩").toString()=="")
            {
                ;//选了这门课，但这门课还没期末考试，或还没出期末考试成绩，
                //那么该学生还没获得这门课的学分。成绩没出，即还没获得这门课的绩点
            }else if(record.value("考试成绩").toFloat()<60)
            {
                ;//考试成绩出了，该生这门课不及格，60分以下不得这门课学分
                //不及格得重修，不得这门课绩点
            }
            else
            {
                credit=(float) credit+ record.value("课程学分").toFloat();
                scoreInt=(float)scoreInt+1;//重修的，考过了，不管考多少分绩点都是1
            }
        }
        else if(record.value("是否重修").toString()=="否")
        {
            if(record.value("考试成绩").toString()=="")//这里阻拦一下没出成绩的，防止没出成绩被当成成绩是0分
            {
                ;//选了这门课，但这门课还没期末考试，或还没出期末考试成绩，
                //那么该学生还没获得这门课的学分。成绩没出，即还没获得这门课的绩点
            }else if(record.value("考试成绩").toFloat()<60)
            {
                ;//考试成绩出了，该生这门课不及格，60分以下不得这门课学分
                //不及格得重修，不得这门课绩点
            }
            else
            {
                credit=(float)credit + record.value("课程学分").toFloat();
                scoreInt=(float)scoreInt+(float)(record.value("课程学分").toFloat()*((float)((float)(record.value("考试成绩").toFloat()/10)-5)));
            }
        }
    }
    this->ui->listWidget->addItem(QString("\n总学分：%1").arg(credit));
    this->ui->listWidget->addItem(QString("平均绩点：%1").arg((float)(scoreInt/credit)));
}

void QueryScore::on_query_clicked()
{
    this->ui->listWidget->clear();
    QString lineEdit=this->ui->lineEdit->text();
    model->setFilter(QString("修读学生的学号='%1'and 考试成绩 IS NOT NULL").arg(lineEdit));
    model->select();
    countScore();
}

void QueryScore::on_rise_clicked()
{
    model->setSort(3,Qt::AscendingOrder);
    model->select();
    this->ui->listWidget->clear();
    countScore();
}

void QueryScore::on_decline_clicked()
{
    model->setSort(3,Qt::DescendingOrder);
    model->select();
    this->ui->listWidget->clear();
    countScore();
}
